#include "compile_run.hpp"
#include "../comm/httplib.h"//以网络的形式,对外提供服务
using namespace ns_compile_and_run;
using namespace httplib;
void Usage(std::string proc)
{
    std::cerr << "Usage: " << "\n\t" << proc << " port" << std::endl;
}
//必须这样调用: ./compile_server port
int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return 1;
    }
    Server svr;//创建HTTP对象

    //Get的参数:第一个参数:要请求的服务     第二个参数:设置回调
    //当http请求访问hello资源,就会执行后面的回调
    //注意:当前启动的时候,这个Get方法并没有被调用,只有当服务来的时候,才会执行它,相当于是注册一个回调方法
    //因为Response对象要被别人改写,所以不能加const
    svr.Get("/hello",[](const Request &req, Response &resp)// 用来进行基本测试
    { 
        //第一个参数:响应的内容	第二个参数：响应的文本的格式 ,因为可能乱码,所以还要设置编码格式
        resp.set_content("hello httplib,你好 httplib!", "text/plain;charset=utf-8");
    });

    //客户端将来采用Post的方式来请求compile_and_run服务,就会执行下面的回调
    //后序当用户请求到来的时候,我们获得Requset当中的json串,然后在lambda表达式里面调用编译运行服务得到json串返回给客户端
    svr.Post("/compile_and_run", [](const Request &req, Response &resp){
        // 用户请求的服务正文是我们想要的json string
        std::string in_json = req.body;//Post方法的body部分就是正文,包含的就是用户输入的json串
        std::string out_json;//保存返回的json串
        if(!in_json.empty()) //用户有输入内容
        {
            CompileAndRun::Start(in_json, &out_json);
            resp.set_content(out_json, "application/json;charset=utf-8");//响应文本是json串
        }
    });

    //设置监听状态：在哪个ip当中,在哪个端口当中提供服务
    svr.listen("0.0.0.0", atoi(argv[1])); //启动http服务
}



// //客户端通过HTTP协议向编译服务上传一个json串，编译模块发送回一个json串
// int main()
// {
//     std::string in_json;
//     Json::Value in_value;
//     in_value["code"] = R"(#include<iostream>
//     int main(){
//         std::cout << "你可以看见我了" << std::endl;
//         aaa
//         return 0;
//     })";
//     in_value["input"] = "";
//     in_value["cpu_limit"] = 1;
//     in_value["mem_limit"] = 10240*3;
//     Json::FastWriter writer;
//     in_json = writer.write(in_value);
//     std::cout << in_json << std::endl;
//     //这个是将来给客户端返回的json串
//     std::string out_json;
//     CompileAndRun::Start(in_json, &out_json);

//     std::cout << out_json << std::endl;
//     return 0;
// }